API ワークフローをノーコードでグラフィカルに構築する新機能「Postman Flows」を試してみた
こんにちは、MAD事業部のきんじょーです。
REST APIの開発をしていて実際に叩いてテストをする際、みなさんは何のツールを使っていますか?
OpenAPIの定義を読み込んですぐに叩け、環境毎の変数の管理が楽なので、私はPostmanを使うことが多いです。
つい先日、Postmanを開くと「Flows」という見慣れないアイコンが追加されていることに気づきました。試してみるとグラフィカルに複数のAPIを組み合わせたワークフローを構築できる便利な機能だったので、この記事で「Postman Flows」を紹介したいと思います。
Postman Flows とは
Postman Flows は API を論理的に接続するための、API ワークフロービルダーです。Flows を使ってリクエストを連鎖させたり、データを処理したり、実際のワークフローを Postman のワークスペース内で作成できます。
ref: postmanlabs/postman-flows
たとえば、シナリオベースのテストで以下のようなフローを組もうとすると、何かしらのコードを書く必要があります。
- あるAPIの結果を元に別のAPIを呼ぶ
- APIの結果を元に条件分岐や繰り返し処理を行う
- 複数のAPIの結果をマージして別のAPIを呼ぶ
「Postman Flows」を使うと、このような処理を直感的なGUIを用いてノーコードで組むことができます。 現時点ではベータ版で、無料で使用できます。
やってみる
テスト用APIの準備
テスト用のAPIにPet Storeを使用します。 swagger.jsonをダウンロードし、Postmanへインポートします。
200応答が返ってきました。テスト用APIの準備はこれで完了です。
簡単なフローの構築
まずは上記と同じく、ペット登録APIを叩くだけのフローを作成し、GUIの使い方を確認します。
新規フローの作成
左のメニューからFlowsを選択し、新規フローを作成します。
ブロックの追加
Startの+
からAPIへリクエストを送信するSend Request
と、ターミナルへ結果を出力するTerminal
のブロックを追加します。下にある+ Block
からも自由にブロックの追加が可能です。
実行結果の確認
コンソールではAPIのリクエストとレスポンスの情報を確認できます。
ターミナルではTerminal
ブロックに接続して出力したログが確認できます。
ロググループを設定して、ログを出力するグループを分けることも可能です。
ブロックについて
操作方法
- 入力・出力
- 入力の
+
へ前のブロックから矢印で繋ぎ、出力の+
から後続ブロックへの出力を生やします。 - 入出力のポートの種類や対応する型はブロックにより違います。
- 入力の
- 簡易設定
- ブロックの設定を入力します。
- SendRequestの場合、叩くAPIのパスと、使用するEnvironment(変数のセット)、変数に割り当てる値を指定します。
- 詳細設定
- ウィンドウが開き、より詳細にブロックの設定が可能です。
- 後続ブロックの指定
- 処理が完了した後に発火させる、次のブロックを指定します。
- 出力のポートと違い、後続ブロックに対して出力結果は渡されないため、実行タイミングだけを制御したい場合に使えそうです。
ブロックの種類
各ブロックの説明と入出力を以下にまとめました。
ブロック名 | 説明 | 入力 | 出力 |
---|---|---|---|
Check | 入力を検証しパスした場合のみ後続へデータを渡します。検証対象のPrimaryと検証時に使用するSecondaryの2つのデータを渡すことができます。 | Primary Secondary |
Primary |
Concatenate | 2つのListを受け取り1つのListに合体して返します。 | 2つのList | 1つのList |
Condition | 入力を検証し、trueとfalseの場合で処理を分岐します。 | Data | Accept Reject |
Create Data | 自由にデータを作成・変更できます。 | Data(任意) | Data |
Create Durables | Flowsの中で扱う変数のことをDurablesと呼びます。このブロックで変数の定宣言や値の割当ができます。 | Data | 変数に値がセットされる |
Delay | 指定したミリ秒の間待機し、受け取ったデータを後続処理へ流します。 | Data | Data |
For Each | 入力で受け取ったListの要素数分繰り返します。 | List | Listの要素 |
Group By | 入力で受け取ったListの内容で、要素をグルーピングします。 | List | Group |
List Top | Listから最初の1件を取り出します。 | List | 最初の1要素 |
Merge | Sourceに入力された値をTargetにマージします。 | Source Target |
MergeされたData |
Send Request | APIへリクエストを送信します。出力はAPIのレスポンスと結果検証用のTestがあります。 | Durables | Response Test |
Terminal | 入力を画面右側のターミナルへ出力します。 | Data | Terminalのログ |
Test Summary | テスト結果を集計し、テスト結果のレポートを出力します。 | Test | Testレポート |
ハマったポイント
APIのレスポンスを解釈するためには、APIにexample
が設定されている必要があります。
たとえば、Send Request
の結果をCheck
で検証しようとする場合、
APIのexample
が設定されていない状態だと、APIのレスポンスを解釈できていないため、bodyはstringの扱いになっています。
この状態だとレスポンスの型がわからないため、後続ブロックでレスポンスの中身を取り出して扱うことができません。
このような場合、1度APIを実行しexample
を保存する必要があります。
するとAPIのレスポンスの型が解釈され、後続のブロックで使用できるようになります。
テストシナリオを組んでみる
使い方がなんとなく掴めたので、以下のもう少し複雑なシナリオを組んでみます。
- ユーザーのログイン
- ペットの登録
- 登録したペットの取得
- 1から3の処理を3回繰り返して終了する
2から3は登録した情報をもとに次のAPIを叩くため、本来であればSend Request
の間にCreate Durables
を挟んで変数を渡す必要がありますが、Mockを叩いているので省略しました。
4の繰り返し処理については、最初のCreate Durables
でループカウンターを宣言し、APIのリクエストが終わったタイミングでCreate Durables
を使いインクリメントし、指定回数に満たない場合はConditions
でフローの最初に飛ばしています。
簡単にAPIのワークフローが作成できました
このように「Postman Flows」を使用することで、直感的なインタフェースを用いて、複数のAPIを組み合わせて実行するワークフローをノーコードで作成することができました。
最後にこのサービスの向き不向きをまとめて終わりたいと思います。
向いているケース
あまり複雑ではないものをノーコードで作りたい時に向いています。
- シナリオベースのテストの自動化
- 複数のAPIを組み合わせて大量のテストデータ作成
今後のロードマップでは、作成したフローのエクスポートが予定されていました。実装されれば以下も可能になるのを期待しています。
- 定期実行してAPIの外形監視(未実装?)
- CI/CD環境でAPIのE2Eテスト(未実装?)
向かないケース
- 複雑な分岐や繰り返し処理や、大規模なワークフロー構築
- GUIでフローを組んでプログラミングをするサービスについて、初回の構築の容易さと保守性は反比例すると考えています。
- 大規模で複雑になると可読性が著しく下がったり、複数人で開発を行う際のソース管理や構成管理のコストが高くついてくるので、素直にプログラミング言語で実装すべきです。
- 本番ワークロード
- 現時点でベータ版のため、開発途中のサービスです。
- フローを切断するとDurablesの型が認識されないなど、いくつか不安定な挙動を発見しました。
- 負荷テスト
- 一連のAPI実行のシナリオを組むことは可能ですが、想定最大同時リクエスト数に向けて指定した増分でリクエストを増やし、一定の期間継続して負荷をかけるといった、負荷テスト特有のシナリオには対応していません。 負荷テストにはLocustなどを利用しましょう。
この記事で少しでも興味を持っていただいた方は、是非「Postman Flows」を試してみてください。
以上。MAD事業部のきんじょーでした。
参考
以下を参考にさせていただきました。